/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.indicadores.vo.TipoObjetivoVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * Data Access Object da entidade TipoObjetivo do módulo de Indicadores. 
 * Essa classe é responsável por todas as operações de banco de dados
 * relacionadas à entidade.
 * 
 * @author Aluno RA
 */
public class TipoObjetivoDAO extends BaseDAO<TipoObjetivoVO> {

    @Override
    public void inserir(TipoObjetivoVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TT_TipoObjetivo(NO_TipoObjetivo, DS_TipoObjetivo)");
        query.append("VALUES (?, ?)");

        List<?> parametros = criarParametros(entidade.getNoTipoObjetivo(),
                entidade.getDsTipoObjetivo());

        Integer idGerado = ((Long) executarInsercao(query.toString(), parametros)).intValue();

        entidade.setIdTipoObjetivo(idGerado);
    }

    @Override
    public void alterar(TipoObjetivoVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TT_TipoObjetivo SET NO_TipoObjetivo = ?,");
        query.append("DS_TipoObjetivo = ?");
        query.append("WHERE ID_TipoObjetivo = ?");

        List<?> parametros = criarParametros(entidade.getNoTipoObjetivo(),
                entidade.getDsTipoObjetivo(), entidade.getIdTipoObjetivo());

        executarAlteracao(query.toString(), parametros);
    }

    @Override
    public void excluir(TipoObjetivoVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TT_TipoObjetivo");
        query.append("WHERE ID_TipoObjetivo = ?");

        executarAlteracao(query.toString(), criarParametros(entidade.getIdTipoObjetivo()));
    }

    @Override
    public TipoObjetivoVO consultarPorId(Serializable id) {

        TipoObjetivoVO entidade = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TT_TipoObjetivo T WHERE T.ID_TipoObjetivo = ?");

        entidade = consultarUm(query.toString(), criarParametros(id));

        return entidade;
    }

    @Override
    public List<TipoObjetivoVO> consultarPorExemplo(TipoObjetivoVO exemplo) {

        List<TipoObjetivoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TT_TipoObjetivo T WHERE 1=1");

        mapearQueryParaExemplo(query, exemplo);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }

    @Override
    protected TipoObjetivoVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        TipoObjetivoVO entidade = new TipoObjetivoVO();
        
        entidade.setIdTipoObjetivo(new Integer(rs.getInt("ID_TipoObjetivo")));        
        entidade.setNoTipoObjetivo(rs.getString("NO_TipoObjetivo"));
        entidade.setDsTipoObjetivo(rs.getString("DS_TipoObjetivo"));

        return entidade;
    }

    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, TipoObjetivoVO exemplo) {

        if (exemplo.getNoTipoObjetivo() != null && !exemplo.getNoTipoObjetivo().isEmpty()) {
            query.append("AND T.NO_TipoObjetivo LIKE ?");
            adicionarParametro("%" + exemplo.getNoTipoObjetivo() + "%");
        }

        if (exemplo.getDsTipoObjetivo() != null) {
            query.append("AND T.DS_TipoObjetivo = ?");
            adicionarParametro(exemplo.getDsTipoObjetivo());
        }
    }
}
